package protocol.hdlc;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import utils.trame.Trame;
import utils.trame.Trame.TrameType;

/**
 * Permet de construire des trames de donnees pour le protocole HDLC selon un
 * {@link BufferedReader}.
 * 
 * @author Bertholet Damien & Daoust Julien
 */
public class TrameBuilder {

	private List<Trame> buffer = new ArrayList<Trame>();
	private final BufferedReader reader;
	private final int windowSize;
	private int num = -1;

	/**
	 * Constructeur.
	 * 
	 * @param reader
	 *            Le {@link BufferedReader} des donnees.
	 * @param windowSize
	 *            La taille de la fenetre utilisee.
	 */
	public TrameBuilder(BufferedReader reader, int windowSize) {
		this.reader = reader;
		this.windowSize = windowSize;
	}

	/**
	 * Construit et renvoie la prochaine {@link Trame}.
	 * 
	 * @return Construit et renvoie la prochaine {@link Trame}. ; null s'il n'y
	 *         a plus de {@link Trame}.
	 * @throws RuntimeException
	 *             S'il y a un probleme a la lecture des donnees.
	 */
	public Trame builtNextTrame() throws RuntimeException {
		if(!buffer.isEmpty()) {
			Trame trame = buffer.get(buffer.size() - 1);
			buffer.remove(trame);
			return trame;
		}

		String data;
		try {
			data = reader.readLine();
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
		if(data == null)
			return null;

		num++;
		if(num == windowSize)
			num = 0;

		return new Trame(TrameType.I, num, data);
	}

	/**
	 * Ajoute une {@link Trame} qui sera dans un buffer.
	 * 
	 * @param trame
	 *            La {@link Trame} a ajouter.
	 */
	public void pushTrame(Trame trame) {
		buffer.add(trame);
	}
}